#include <iostream>
#include <ctime>
using namespace std;
const int maxsize =100;
int n;
int a[maxsize];
int res[maxsize];
int k;//最大的数的范围表示要开多少空间

void init(int a[])
{
    srand(time(0));
    for (int i = 0; i <n ; ++i) {
        a[i]=rand()%10;
    }
}
void print(int a[],int n)
{
    for (int i = 0; i <n ; ++i) {
        cout<<a[i]<<" ";
    }
    cout<<endl;
}

//初始化计算每个元素出现在的次数
int main() {


    cin>>n>>k;//输入数组元素个数以及开辟的空间数
    init(a);
    print(a,n);
    //动态开辟数组并且赋值为0  数组空间的大小取决于最大最小值的范围
    int *b=new int (sizeof(int)*k);
    memset(b,0,sizeof(int)*k);
     //计算cnt数
     for(int i=0;i<n;++i)
    {
        b[a[i]]++;
    }
    for(int i=1;i<k;++i)
    {
        cout<<b[i]<<" "<<i<<endl;
    }
     //计算小于等于当前i的个数
    for(int i=1;i<k;++i)
    {
        b[i]=b[i-1]+b[i];
    }
    cout<<"-------"<<endl;
    for(int i=1;i<k;++i)
    {
        cout<<b[i]<<" "<<i<<endl;
    }
    cout<<"-------"<<endl;
    //从a数组的最后开始放元素
    for(int i=0;i<n;++i)
    {
        b[a[i]]--;
        res[b[a[i]]]=a[i];
    }

    print(res,n);


    return 0;
}
